// 车辆类
class Car {
    // 车牌号
    plateNumber: string;
    // 进入停车场的时间
    enterTime: Date;

    // 构造函数，初始化车辆信息
    constructor(plateNumber: string) {
        this.plateNumber = plateNumber;
        this.enterTime = new Date(); // 记录驶入停车场的时间
    }
}

class Place {
    // 车牌号
    plateNumber: string;
    // 进入停车场的时间
    enterTime: Date;

    // 构造函数，初始化车辆信息
    constructor(plateNumber: string) {
        this.plateNumber = plateNumber;
        this.enterTime = new Date(); // 记录驶入停车场的时间
    }
}


// 摄像头类(Camera)
class Camera {
    //识别车牌号
    recognizePlate(car: Car): string {
        // 模拟车牌号识别
        return car.plateNumber;
    }
}

// 停车场层级类
class Floor {
    // 层级编号
    floorNumber: number;
    // 车位总数
    capacity: number;
    // 空闲车位数量
    vacantSpaces: number;
    // 当前停放的车辆列表
    cars: Car[];

    // 构造函数，初始化停车场层级
    constructor(floorNumber: number, capacity: number) {
        this.floorNumber = floorNumber;
        this.capacity = capacity;
        this.vacantSpaces = capacity;
        this.cars = [];
    }

    // 车辆进入停车场
    enter (car: Car): void {
        this.cars.push(car);
        this.vacantSpaces--;
        console.log(`车辆 ${car.plateNumber} 进入 ${this.floorNumber} 层停车场`);
        console.log(`空余车位数量：${this.vacantSpaces}/${this.capacity}`);
    }

    // 车辆离开停车场
    exit(car: Car): void {
        const index = this.cars.indexOf(car);
        if (index !== -1) {
            this.cars.splice(index, 1);
            this.vacantSpaces++;
            console.log(`车辆 ${car.plateNumber} 离开 ${this.floorNumber} 层停车场`);
            console.log(`空余车位数量：${this.vacantSpaces}/${this.capacity}`);

        }
    }
}


// 出口显示器类
class Screen {
    show(car: Car): void {
        console.log(`车辆 ${car.plateNumber} 离开停车场`);
        const exitTime = new Date();
        const duration = (exitTime.getTime() - car.enterTime.getTime()) / (1000 * 60); // 计算停车时长（分钟）
        console.log(`停车时长：${duration.toFixed(2)} 分钟`);
    }
}

// 停车场类
class Park {
    floors: Floor[];

    constructor(levelsCount: number, spacesPerLevel: number) {
        this.floors = [];
        for (let i = 0; i < levelsCount; i++) {
            this.floors.push(new Floor(i + 1, spacesPerLevel));
        }
    }


    // 车辆进入停车场
    enter(car: Car): void {
        const vacantLevel = this.floors.find(floor => floor.vacantSpaces > 0);
        if (vacantLevel) {
            vacantLevel.enter(car);
        } else {
            console.log('停车场已满，无法进入');
        }
    }

    // 车辆离开停车场
    exit(car: Car): void {
        const level = this.floors.find(floor => floor.cars.includes(car));
        if (level) {
            level.exit(car);
        } else {
            console.log('该车辆不在停车场内');
        }
    }
}

// 使用示例
const parkingLot = new Park(3, 100);

// 车辆进入停车场
const car1 = new Car('京A12345');
parkingLot.enter(car1);
// 车辆进入停车场
const car2 = new Car('京A34567');
parkingLot.enter(car2);
// 车辆离开停车场


setTimeout(() => {
    parkingLot.exit(car1);
    let screen = new Screen();
    screen.show(car1)
}, 5000); // 模拟停车5分钟后离开
